package com.example.utils;


import com.example.bean.StickData;
import com.tictactec.ta.lib.Core;
import com.tictactec.ta.lib.MInteger;
import com.tictactec.ta.lib.RetCode;

import java.util.List;



/**
 * Created by Arvin on 2016/9/14.
 * 计算各种指标
 */
public class IndexParseUtil {

    //均线跨度(SMA5,SMA10,SMA20),注意修改该值时，需要同时增加StickData里面的sma字段、修改本类initSma方法，否则不会生效
    public static final int START_SMA5 = 5;
    public static final int START_SMA10 = 10;
    public static final int START_SMA20 = 20;
    public static final int START_SMA30 = 30;
    //26:计算MACD时，26段close均价DIF=(EMA(CLOSE,12) - EMA(CLOSE,26))
    public static final int START_DIF = 1;
    //35：计算MACD时，35段开始取前九日DIF值 DEA:=EMA(DIF,9)
    public static final int START_DEA = 1;
    //12:计算K值
    public static final int START_K = 12;
    //15:计算DJ
    public static final int START_DJ = 15;
    //9:计算RSV
    public static final int START_REV = 9;

    public static final int[] SMA = {START_SMA5,START_SMA10, START_SMA20,START_SMA30};

    /**
     * 精度
     */
    public static int scale_price;
    public static void updateMACD(List<StickData> list) {
        if(list == null) return;
        //1计算出所有的DIF
        for(int i = list.size()-1; i < list.size(); i++) {
            if(i==0) {
                list.get(0).setEma12(list.get(i).getClose());
                list.get(0).setEma26(list.get(i).getClose());
                list.get(0).setDif(0);
            }
            else
            {
                double price=list.get(i).getClose();

                String s1=NumberUtil2.getString(price+"","2",8);
                s1=NumberUtil2.getDivString(s1,"13",8);

                String s2=NumberUtil2.getString(list.get(i-1).getEma12()+"","11",8);
                s2=NumberUtil2.getDivString(s2,"13",8);


                String s3=NumberUtil2.getString(price+"","2",8);
                s3=NumberUtil2.getDivString(s3,"27",8);

                String s4=NumberUtil2.getString(list.get(i-1).getEma26()+"","25",8);
                s4=NumberUtil2.getDivString(s4,"27",8);


                String ema12=NumberUtil2.getAddString(s1,s2,8);
                String ema26=NumberUtil2.getAddString(s3,s4,8);


                //  double ema12=list.get(i).getClose()*2/13+list.get(i-1).getEma12()*11/13;
                //  double ema26=list.get(i).getClose()*2/27+list.get(i-1).getEma12()*25/27;
                String s5= NumberUtil2.getSubString(ema12+"",ema26+"",8);
                list.get(i).setEma12(Double.parseDouble(ema12));
                list.get(i).setEma26(Double.parseDouble(ema26));
                list.get(i).setDif(Double.parseDouble(s5));
            }
        }
        //2计算出所有的DEA
        for(int i =list.size()-1; i < list.size(); i++) {
            if(i==0)
            {
                list.get(0).setDea(0);
            }
            else
            {
                double dea=list.get(i-1).getDea()*8/10+list.get(i).getDif()*2/10;
                list.get(i).setDea(dea);
                list.get(i).setMacd((list.get(i).getDif()-dea)*2);
            }
//            if(i + START_DEA <= list.size()) {
//                list.get(i + START_DEA - 1).setDea(getDifSma(list.subList(i + START_DEA - 9, i + START_DEA)));
//                //3计算MACD
//                list.get(i + START_DEA - 1).setMacd(2d * (list.get(i + START_DEA - 1).getDif() - list.get(i + START_DEA - 1).getDea()));
//            }
        }

    }
    /**
     * 计算MACD
     * @param list
     */
    public static void initMACD(List<StickData> list) {
        if(list == null) return;
        //1计算出所有的DIF
        for(int i = 0; i < list.size(); i++) {
            if(i==0) {
                list.get(0).setEma12(list.get(i).getClose());
                list.get(0).setEma26(list.get(i).getClose());
                list.get(0).setDif(0);
            }
            else
            {
                double price=list.get(i).getClose();

                String s1=NumberUtil2.getString(price+"","2",8);
                s1=NumberUtil2.getDivString(s1,"13",8);

                String s2=NumberUtil2.getString(list.get(i-1).getEma12()+"","11",8);
                s2=NumberUtil2.getDivString(s2,"13",8);


                String s3=NumberUtil2.getString(price+"","2",8);
                s3=NumberUtil2.getDivString(s3,"27",8);

                String s4=NumberUtil2.getString(list.get(i-1).getEma26()+"","25",8);
                s4=NumberUtil2.getDivString(s4,"27",8);


                String ema12=NumberUtil2.getAddString(s1,s2,8);
                String ema26=NumberUtil2.getAddString(s3,s4,8);


                //  double ema12=list.get(i).getClose()*2/13+list.get(i-1).getEma12()*11/13;
                //  double ema26=list.get(i).getClose()*2/27+list.get(i-1).getEma12()*25/27;
                String s5= NumberUtil2.getSubString(ema12+"",ema26+"",8);
                list.get(i).setEma12(Double.parseDouble(ema12));
                list.get(i).setEma26(Double.parseDouble(ema26));
                list.get(i).setDif(Double.parseDouble(s5));
            }
        }
        //2计算出所有的DEA
        for(int i = 0; i < list.size(); i++) {
            if(i==0)
            {
                list.get(0).setDea(0);
            }
            else
            {
                double dea=list.get(i-1).getDea()*8/10+list.get(i).getDif()*2/10;
                list.get(i).setDea(dea);
                list.get(i).setMacd((list.get(i).getDif()-dea)*2);
            }
//            if(i + START_DEA <= list.size()) {
//                list.get(i + START_DEA - 1).setDea(getDifSma(list.subList(i + START_DEA - 9, i + START_DEA)));
//                //3计算MACD
//                list.get(i + START_DEA - 1).setMacd(2d * (list.get(i + START_DEA - 1).getDif() - list.get(i + START_DEA - 1).getDea()));
//            }
        }

    }
    public static void updateKDJ(List<StickData> list) {
        if(list == null) return;
        //1计算出所有的REV
        for(int i = list.size()-1; i < list.size(); i++) {
            if(i>=8) {
                //第9日开始计算RSV
                StickData data = list.get(i);
                double[] maxAndMin = getMaxAndMin(list.subList(i-8,i+1));
                String s1=NumberUtil2.getSubString(data.getClose()+"",maxAndMin[1]+"",scale_price);
                String s2=NumberUtil2.getSubString(maxAndMin[0]+"",maxAndMin[1]+"",scale_price);
                String s3="0";

                //double rsv=(data.getClose() - maxAndMin[1]) / (maxAndMin[0] - maxAndMin[1]) * 100;
//                if(maxAndMin[0] - maxAndMin[1]==0)
//                {
//                    rsv=0;
//                }
                if(NumberUtil2.isDaYu(s2,"0")!=0)
                {
                    s3=NumberUtil2.getDivString(s1,s2,10);
                    list.get(i).setRsv(Double.parseDouble(NumberUtil2.getString(s3+"","100",10)));
                }
                else
                {
                    list.get(i).setRsv(0);
                }


            }
        }
        //2计算出所有K d j
        for(int i = list.size()-1; i < list.size(); i++) {
            if(i==8) {
                String k2b=NumberUtil2.getString(50+"","2",10);
                String s2=NumberUtil2.getAddString(k2b,list.get(i).getRsv()+"",10);
                String k= NumberUtil2.getDivString(s2,"3",10);

                String d2b=NumberUtil2.getString(50+"","2",10);
                String s3=NumberUtil2.getAddString(d2b,k,10);
                String d= NumberUtil2.getDivString(s3,"3",10);

                double j=3 * list.get(i).getK() - 2 * list.get(i).getD();
                list.get(i).setK(Double.parseDouble(NumberUtil2.getString(k+"","1",10)));
                list.get(i).setD(Double.parseDouble(NumberUtil2.getString(d+"","1",10)));
                list.get(i).setJ(Double.parseDouble(NumberUtil2.getString(j+"","1",10)));
            }
            if(i>8)
            {
                String k2b=NumberUtil2.getString(list.get(i-1).getK()+"","2",10);
                String s2=NumberUtil2.getAddString(k2b,list.get(i).getRsv()+"",10);
                String k= NumberUtil2.getDivString(s2,"3",10);

                String d2b=NumberUtil2.getString(list.get(i-1).getD()+"","2",10);
                String s3=NumberUtil2.getAddString(d2b,k,10);
                String d= NumberUtil2.getDivString(s3,"3",10);



                double j=3 * list.get(i).getK() - 2 * list.get(i).getD();
                list.get(i).setK(Double.parseDouble(NumberUtil2.getString(k+"","1",10)));
                list.get(i).setD(Double.parseDouble(NumberUtil2.getString(d+"","1",10)));
                list.get(i).setJ(Double.parseDouble(NumberUtil2.getString(j+"","1",10)));
            }
        }


    }
    /**
     * n日RSV=（Cn－Ln）/（Hn－Ln）×100
     公式中，Cn为第n日收盘价；Ln为n日内的最低价；Hn为n日内的最高价。
     其次，计算K值与D值：
     当日K值=2/3×前一日K值+1/3×当日RSV
     当日D值=2/3×前一日D值+1/3×当日K值
     若无前一日K 值与D值，则可分别用50来代替。
     J值=3*当日K值-2*当日D值
     * 计算KDJ
     * @param list
     */
    public static void initKDJ(List<StickData> list) {
        if(list == null) return;
        //1计算出所有的REV
        for(int i = 0; i < list.size(); i++) {
            if(i>=8) {
                //第9日开始计算RSV
                StickData data = list.get(i);
                double[] maxAndMin = getMaxAndMin(list.subList(i-8,i+1));
                String s1=NumberUtil2.getSubString(data.getClose()+"",maxAndMin[1]+"",scale_price);
                String s2=NumberUtil2.getSubString(maxAndMin[0]+"",maxAndMin[1]+"",scale_price);
                String s3="0";

                //double rsv=(data.getClose() - maxAndMin[1]) / (maxAndMin[0] - maxAndMin[1]) * 100;
//                if(maxAndMin[0] - maxAndMin[1]==0)
//                {
//                    rsv=0;
//                }
                if(NumberUtil2.isDaYu(s2,"0")!=0)
                {
                    s3=NumberUtil2.getDivString(s1,s2,10);
                    list.get(i).setRsv(Double.parseDouble(NumberUtil2.getString(s3+"","100",10)));
                }
                else
                {
                    list.get(i).setRsv(0);
                }


            }
        }
        //2计算出所有K d j
        for(int i = 0; i < list.size(); i++) {
            if(i==8) {
                String k2b=NumberUtil2.getString(50+"","2",10);
                String s2=NumberUtil2.getAddString(k2b,list.get(i).getRsv()+"",10);
                String k= NumberUtil2.getDivString(s2,"3",10);

                String d2b=NumberUtil2.getString(50+"","2",10);
                String s3=NumberUtil2.getAddString(d2b,k,10);
                String d= NumberUtil2.getDivString(s3,"3",10);
//                String rsv1=NumberUtil2.getDivString(list.get(i).getRsv()+"","3",8);
//                String k1=NumberUtil2.getDivString(50+"","3",8);
//                String k2=NumberUtil2.getString(k1,"2",8);
//                String k= NumberUtil2.getAddString(k2,rsv1,8);
//                String k1_3=NumberUtil2.getDivString(k,"3",8);

//                String d1=NumberUtil2.getDivString(50+"","3",8);
//                String d2=NumberUtil2.getString(d1,"2",8);
//                String d= NumberUtil2.getAddString(d2,k1_3,8);

                // double d1=1/3*list.get(i).getRsv();
                // double d2=1/3*list.get(i).getK();
                //double k=50*2/3+1/3*list.get(i).getRsv();
                // double d=50*2/3+1/3*list.get(i).getK();
                double j=3 * list.get(i).getK() - 2 * list.get(i).getD();
                list.get(i).setK(Double.parseDouble(NumberUtil2.getString(k+"","1",10)));
                list.get(i).setD(Double.parseDouble(NumberUtil2.getString(d+"","1",10)));
                list.get(i).setJ(Double.parseDouble(NumberUtil2.getString(j+"","1",10)));
            }
            if(i>8)
            {
                String k2b=NumberUtil2.getString(list.get(i-1).getK()+"","2",10);
                String s2=NumberUtil2.getAddString(k2b,list.get(i).getRsv()+"",10);
                String k= NumberUtil2.getDivString(s2,"3",10);

                String d2b=NumberUtil2.getString(list.get(i-1).getD()+"","2",10);
                String s3=NumberUtil2.getAddString(d2b,k,10);
                String d= NumberUtil2.getDivString(s3,"3",10);


//                String rsv1=NumberUtil2.getDivString(list.get(i).getRsv()+"","3",8);
//                String k1=NumberUtil2.getDivString(list.get(i-1).getK()+"","3",8);
//                String k2=NumberUtil2.getString(k1,"2",8);
//                String k= NumberUtil2.getAddString(k2,rsv1,8);
//                String k1_3=NumberUtil2.getDivString(k,"3",8);
//
//                String d1=NumberUtil2.getDivString(list.get(i-1).getD()+"","3",8);
//                String d2=NumberUtil2.getString(d1,"2",8);
//                String d= NumberUtil2.getAddString(d2,k1_3,8);

//                double d1=1/3*list.get(i).getRsv();
//                double d2=1/3*list.get(i).getK();
//                double d3=list.get(i-1).getK()*2/3;
//                double d4=list.get(i-1).getD()*2/3;
                //double k=list.get(i-1).getK()*2/3+1/3*list.get(i).getRsv();
                // double d=list.get(i-1).getD()*2/3+1/3*list.get(i).getK();
                double j=3 * list.get(i).getK() - 2 * list.get(i).getD();
                list.get(i).setK(Double.parseDouble(NumberUtil2.getString(k+"","1",10)));
                list.get(i).setD(Double.parseDouble(NumberUtil2.getString(d+"","1",10)));
                list.get(i).setJ(Double.parseDouble(NumberUtil2.getString(j+"","1",10)));
            }
        }


    }
    public static void updateSma(List<StickData> list)
    {
        if (list == null) return;
        for (int i = 0; i < list.size(); i++) {
            for (int j : SMA) {
                if (i + j== list.size()) {
                    //第5日开始计算5日均线
                    if (j == START_SMA5) {
                        //量的SMA5
                        list.get(i + j - 1).setCountSma5(getCountSma(list.subList(i, i + j)));
                        //K线的SMA5
                        list.get(i + j - 1).setSma5(getCloseSma(list.subList(i, i + j)));
                    } else
                        //第10日开始计算10日均线
                        if (j == START_SMA10) {
                            //量的SMA10
                            list.get(i + j - 1).setCountSma10(getCountSma(list.subList(i, i + j)));
                            //K线的SMA10
                            list.get(i + j - 1).setSma10(getCloseSma(list.subList(i, i + j)));
                        }else
                            //第20日开始计算20日均线
                            if (j == START_SMA20) {
                                //K线的SMA20
                                list.get(i + j - 1).setSma20(getCloseSma(list.subList(i, i + j)));
                            }
                            else
                            {
                                if (j == START_SMA30)
                                {
                                    list.get(i + j - 1).setSma30(getCloseSma(list.subList(i, i + j)));
                                }
                            }
                }
            }
        }
    }
    /**
     * 把list里面所有数据对应的均线计算出来并且赋值到里面
     *
     * @param list k线数据
     */
    public static void initSma(List<StickData> list) {
        if (list == null) return;
        for (int i = 0; i < list.size(); i++) {
            for (int j : SMA) {
                if (i + j <= list.size()) {
                    //第5日开始计算5日均线
                    if (j == START_SMA5) {
                        //量的SMA5
                        list.get(i + j - 1).setCountSma5(getCountSma(list.subList(i, i + j)));
                        //K线的SMA5
                        list.get(i + j - 1).setSma5(getCloseSma(list.subList(i, i + j)));
                    } else
                        //第10日开始计算10日均线
                        if (j == START_SMA10) {
                            //量的SMA10
                            list.get(i + j - 1).setCountSma10(getCountSma(list.subList(i, i + j)));
                            //K线的SMA10
                            list.get(i + j - 1).setSma10(getCloseSma(list.subList(i, i + j)));
                        }else
                            //第20日开始计算20日均线
                            if (j == START_SMA20) {
                                //K线的SMA20
                                list.get(i + j - 1).setSma20(getCloseSma(list.subList(i, i + j)));
                            }
                            else
                            {
                                if (j == START_SMA30)
                                {
                                    list.get(i + j - 1).setSma30(getCloseSma(list.subList(i, i + j)));
                                }
                            }
                }
            }
        }
    }
    public static void updateBOLL(List<StickData> list)
    {
        int period=20;
        int k=2;
        if(list==null||list.size()==0)
        {
            return;
        }
        double up;//上轨线
        double mb;//中轨线
        double dn;//下轨线

        //n日
        double sum = 0;
        //n-1日
        double sum2 = 0;
        for (int i = list.size()-1; i < list.size(); i++) {
            StickData sd = list.get(i);
            sum += sd.getClose();
            sum = 0;
            sum2 = 0;
//            if (i > period - 1)
//                sum -= list.get(i - period).getClose();
//            if (i > period - 2)
//                sum2 -= list.get(i - period + 1).getClose();
//
//            //这个范围不计算，在View上的反应就是不显示这个范围的boll线
            if (i < period - 1)
            {

                continue;
            }
            for(int a=0;a<20;a++)
            {
                sum+=list.get(i-a).getClose();
            }

            //n日MA
            double ma = sum /20;
            //n-1日MA
            //double ma2 = sum2 /19;
            double md = 0;
            for (int j =0; j <20; j++) {
                //n日
                md += Math.pow(list.get(i-j).getClose() - ma, 2);
            }
            md = Math.sqrt(md / period);
            //(n－1）日的MA
            mb = ma;
            up = mb + k * md;
            dn = mb - k * md;

            sd.setUp(up);
            sd.setMb(mb);
            sd.setDn(dn);
            // sum2 += sd.getClose();

        }
    }
    /**
     * 【该算法已核实】BOLL(n)计算公式：
     * MA=n日内的收盘价之和÷n。
     * MD=n日的平方根（C－MA）的两次方之和除以n
     * MB=（n－1）日的MA
     * UP=MB+k×MD
     * DN=MB－k×MD
     * K为参数，可根据股票的特性来做相应的调整，一般默认为2
     *
     *
     * period     周期，一般为20
     * k          参数，可根据股票的特性来做相应的调整，一般默认为2
     */
    public  static void initBOLL(List<StickData> list)
    {
        int period=20;
        int k=2;
        if(list==null||list.size()==0)
        {
            return;
        }
        double up;//上轨线
        double mb;//中轨线
        double dn;//下轨线

        //n日
        double sum = 0;
        //n-1日
        double sum2 = 0;
        for (int i = 0; i < list.size(); i++) {
            StickData sd = list.get(i);
            sum += sd.getClose();
            sum = 0;
            sum2 = 0;
//            if (i > period - 1)
//                sum -= list.get(i - period).getClose();
//            if (i > period - 2)
//                sum2 -= list.get(i - period + 1).getClose();
//
//            //这个范围不计算，在View上的反应就是不显示这个范围的boll线
            if (i < period - 1)
            {

                continue;
            }
            for(int a=0;a<20;a++)
            {
                sum+=list.get(i-a).getClose();
            }

            //n日MA
            double ma = sum /20;
            //n-1日MA
            //double ma2 = sum2 /19;
            double md = 0;
            for (int j =0; j <20; j++) {
                //n日
                md += Math.pow(list.get(i-j).getClose() - ma, 2);
            }
            md = Math.sqrt(md / period);
            //(n－1）日的MA
            mb = ma;
            up = mb + k * md;
            dn = mb - k * md;

            sd.setUp(up);
            sd.setMb(mb);
            sd.setDn(dn);
            // sum2 += sd.getClose();

        }

    }
    public static void updateEma(List<StickData> list)
    {
        Core lib=new Core();
        MInteger m1=new MInteger();
        MInteger m2=new MInteger();
        float [] iput=getclose(list);
        for(int i=list.size()-1;i<list.size();i++)
        {

            StickData sd=list.get(i);
            if(i==0)
            {
                sd.setEma5(sd.getClose());
                sd.setEma10(sd.getClose());
                sd.setEma20(sd.getClose());
                sd.setEma30(sd.getClose());
            }
            if(i>=1)
            {
                sd.setEma5(getEXPMA(list,5,i));
            }
            if(i>=1)
            {
                sd.setEma10(getEXPMA(list,10,i));
            }
            if(i>=1)
            {
                sd.setEma20(getEXPMA(list,20,i));
            }
            if(i>=1)
            {
                sd.setEma30(getEXPMA(list,30,i));
            }
        }
    }
    public static void initEma(List<StickData> list)
    {
        Core lib=new Core();
        MInteger m1=new MInteger();
        MInteger m2=new MInteger();
        float [] iput=getclose(list);
        for(int i=0;i<list.size();i++)
        {

            StickData sd=list.get(i);
            if(i==0)
            {
                sd.setEma5(sd.getClose());
                sd.setEma10(sd.getClose());
                sd.setEma20(sd.getClose());
                sd.setEma30(sd.getClose());
            }
            if(i>=1)
            {
                sd.setEma5(getEXPMA(list,5,i));
            }
            if(i>=1)
            {
                sd.setEma10(getEXPMA(list,10,i));
            }
            if(i>=1)
            {
                sd.setEma20(getEXPMA(list,20,i));
            }
            if(i>=1)
            {
                sd.setEma30(getEXPMA(list,30,i));
            }
        }
//        double [] output5=new double[list.size()];
//        double [] output10=new double[list.size()];
//        double [] output20=new double[list.size()];
//        double [] output30=new double[list.size()];
//        lib.ema(0,iput.length-1,iput,5,m1,m2,output5);
//        lib.ema(0,iput.length-1,iput,10,m1,m2,output10);
//        lib.ema(0,iput.length-1,iput,20,m1,m2,output20);
//        lib.ema(0,iput.length-1,iput,30,m1,m2,output30);
//        for(int i=0;i<list.size();i++)
//        {
//            StickData sd=list.get(i);
//            if(i>=4)
//            {
//                sd.setEma5(output5[i-4]);
//            }
//            if(i>=9)
//            {
//                sd.setEma10(output5[i-9]);
//            }
//            if(i>=19)
//            {
//                sd.setEma20(output5[i-19]);
//            }
//            if(i>=29)
//            {
//                sd.setEma30(output5[i-29]);
//            }
//        }

    }
    public static  Double getEXPMA(List<StickData> list,int zhouqi,int index) {
        // 开始计算EMA值，
        Double k = 2.0 /(zhouqi+1.0);// 计算出序数
        Double ema=0d;
        if(zhouqi==index+1)
        {
            ema = list.get(index).getClose();
        }
        else
        {
            if(zhouqi==5)
            {
                ema = list.get(index).getClose() * k + list.get(index-1).getEma5()* (1 - k);
            }
            else if(zhouqi==10)
            {
                ema = list.get(index).getClose() * k + list.get(index-1).getEma10()* (1 - k);
            }
            else if(zhouqi==20)
            {
                ema = list.get(index).getClose() * k + list.get(index-1).getEma20()* (1 - k);
            }
            else if(zhouqi==30)
            {
                ema = list.get(index).getClose() * k + list.get(index-1).getEma30()* (1 - k);
            }
        }

        return ema;
    }
    public static void updateRoc(List<StickData> list)
    {
        Core lib=new Core();
        MInteger m1=new MInteger();
        MInteger m2=new MInteger();
        float [] iput=getclose(list);
        double [] output12=new double[list.size()];



        double roc;
        double rocma;
        StickData sd;
        for(int i=list.size()-1;i<list.size();i++)
        {
            sd=list.get(i);
            if(i>=12)
            {
                roc=(iput[i]-iput[i-12])/iput[i-12]*100;
                sd.setRocN(roc);
            }if(i>=18)
        {
            rocma=(list.get(i).getRocN()+list.get(i-1).getRocN()+list.get(i-2).getRocN()+list.get(i-3).getRocN()+list.get(i-4).getRocN()+list.get(i-5).getRocN())/6;
            sd.setRocM(rocma);
        }
        }

    }
    public static void initRoc(List<StickData> list)
    {
        Core lib=new Core();
        MInteger m1=new MInteger();
        MInteger m2=new MInteger();
        float [] iput=getclose(list);
        double [] output12=new double[list.size()];


//        lib.roc(0,iput.length-1,iput,12,m1,m2,output12);
//        for(int i=0;i<list.size();i++)
//        {
//            StickData sd=list.get(i);
//            if(i>=11)
//            {
//                sd.setRocN(output12[i-11]);
//            }
//            if(i>=16)
//            {
//                double m=output12[i-11]+output12[i-12]+output12[i-13]+output12[i-14]+output12[i-15]+output12[i-16];
//                m=m/6;
//
//                sd.setRocM(m);
//            }
//        }
        double roc;
        double rocma;
        StickData sd;
        for(int i=0;i<iput.length;i++)
        {
            sd=list.get(i);
            if(i>=12)
            {
                roc=(iput[i]-iput[i-12])/iput[i-12]*100;
                sd.setRocN(roc);
            }if(i>=18)
        {
            rocma=(list.get(i).getRocN()+list.get(i-1).getRocN()+list.get(i-2).getRocN()+list.get(i-3).getRocN()+list.get(i-4).getRocN()+list.get(i-5).getRocN())/6;
            sd.setRocM(rocma);
        }
        }

    }
    public  static void updateRsi(List<StickData> list)
    {
        Core lib=new Core();
        MInteger m1=new MInteger();
        MInteger m2=new MInteger();
        float [] iput=getclose(list);
        double [] output6=new double[list.size()];
        double [] output12=new double[list.size()];
        double [] output24=new double[list.size()];



        for(int i=list.size()-1;i<list.size();i++)
        {
            if(i>=5)
            {
                double d1=countRsi(6,i,list);
                list.get(i).setRsi6(d1);
            }
            if(i>=11)
            {
                double d1=countRsi(12,i,list);
                list.get(i).setRsi12(d1);
            }
            if(i>=23)
            {
                double d1=countRsi(24,i,list);
                list.get(i).setRsi24(d1);
            }
        }
    }
    public  static void initRsi(List<StickData> list)
    {

        Core lib=new Core();
        MInteger m1=new MInteger();
        MInteger m2=new MInteger();
        float [] iput=getclose(list);
        double [] output6=new double[list.size()];
        double [] output12=new double[list.size()];
        double [] output24=new double[list.size()];



        for(int i=0;i<iput.length;i++)
        {
            if(i>=5)
            {
                double d1=countRsi(6,i,list);
                list.get(i).setRsi6(d1);
            }
            if(i>=11)
            {
                double d1=countRsi(12,i,list);
                list.get(i).setRsi12(d1);
            }
            if(i>=23)
            {
                double d1=countRsi(24,i,list);
                list.get(i).setRsi24(d1);
            }
        }

//        lib.rsi(0,iput.length-1,iput,6,m1,m2,output6);
//        lib.rsi(0,iput.length-1,iput,12,m1,m2,output12);
//        lib.rsi(0,iput.length-1,iput,24,m1,m2,output24);
//        for(int i=0;i<list.size();i++)
//        {
//            StickData sd=list.get(i);
//            if(i>=5) {
//                sd.setRsi6(output6[i-5]);
//            }
//            if(i>=11)
//            {
//                sd.setRsi12(output12[i-11]);
//            }
//            if(i>=23)
//            {
//                sd.setRsi24(output24[i-23]);
//            }
//
//        }

    }

    /**
     *
     * @param size 周期
     * @param index
     * @param list
     * @return
     */
    private static double countRsi(int size,int index,List<StickData> list)
    {
        double d1=0;
        double dayuZeno=0;
        double xiaoyuZeno=0;
        StickData sd=null;
        for(int i=0;i<size;i++)
        {
            sd=list.get(index-i);
            double open=0;
            if(index-i==0)
            {
                open=list.get(index-i).getOpen();
            }
            else
            {
                open=list.get(index-i-1).getClose();
            }

            double close=sd.getClose();

            if(close>open)
            {
                dayuZeno+=close-open;
            }
            else
            {
                xiaoyuZeno+=open-close;
            }
        }
        if(dayuZeno==0)
        {
            return 0;
        }
        else if(xiaoyuZeno==0)
        {
            return  100;
        }
        //d1=((dayuZeno/size)/(xiaoyuZeno/size))/((dayuZeno/size)/(xiaoyuZeno/size)+1);

//        String rs1=NumberUtil2.getDivString(dayuZeno+"",size+"",12);
//        String rs2=NumberUtil2.getDivString(xiaoyuZeno+"",size+"",12);
//        String rs=NumberUtil2.getDivString(rs1,rs2,12);
//        String rs_1=NumberUtil2.getAddString(rs,"1",12);
//        String rsi=NumberUtil2.getDivString(rs,rs_1,12);
//        rsi=NumberUtil2.getString(rsi,"100",12);

        double d2= Double.parseDouble(NumberUtil2.getString(dayuZeno+"","1",scale_price));
        double d3= Double.parseDouble(NumberUtil2.getString(xiaoyuZeno+"","1",scale_price));
        d1=d2/(d2+d3)*100;
        //d1=dayuZeno/(dayuZeno+xiaoyuZeno)*100;
        //d1=Double.parseDouble(rsi);



        return d1;
    }

    private static float [] getclose(List<StickData> list)
    {
        float [] iput=new float[list.size()];
        for(int i=0;i<list.size();i++)
        {
            iput[i]=(float) list.get(i).getClose();
        }
        return iput;
    }

    /**
     * 计算KDJ时，取9日最高最低值
     * @param datas
     * @return
     */
    private static double[] getMaxAndMin(List<StickData> datas) {
        if(datas == null || datas.size() == 0)
            return new double[]{0, 0};
        double max = datas.get(0).getHigh();
        double min = datas.get(0).getLow();
        for(StickData data : datas) {
            max = max > data.getHigh() ? max : data.getHigh();
            min = min < data.getLow() ? min : data.getLow();
        }
        return new double[]{max, min};
    }


    /**
     * K线量计算移动平均值
     * @param datas
     * @return
     */
    private static double getCountSma(List<StickData> datas) {
        if (datas == null) return -1;
        double sum = 0;
        for (StickData data : datas) {
            sum += data.getCount();
        }
        return NumberUtil.doubleDecimal(sum / datas.size());
    }

    /**
     * K线收盘价计算移动平均价
     * @param datas
     * @return
     */
    private static double getCloseSma(List<StickData> datas) {
        if (datas == null) return -1;
        double sum = 0;
        for (StickData data : datas) {
            sum += data.getClose();
        }
        return NumberUtil.doubleDecimal(sum / datas.size());
    }

    /**
     * K线dif的移动平均值
     * @param datas
     * @return
     */
    private static double getDifSma(List<StickData> datas) {
        if (datas == null) return -1;
        double sum = 0;
        for (StickData data : datas) {
            sum += data.getDif();
        }
        return NumberUtil.doubleDecimal(sum / datas.size());
    }

    /**
     * 三日rsv移动平均值，即K值
     * @param datas
     * @return
     */
    private static double getRSVSma(List<StickData> datas) {
        if (datas == null) return -1;
        double sum = 0;
        for (StickData data : datas) {
            sum += data.getRsv();
        }
        return NumberUtil.doubleDecimal(sum / datas.size());
    }

    /**
     * 三日K移动平均值，即D值
     * @param datas
     * @return
     */
    private static double getKSma(List<StickData> datas) {
        if (datas == null) return -1;
        double sum = 0;
        for (StickData data : datas) {
            sum += data.getK();
        }
        return NumberUtil.doubleDecimal(sum / datas.size());
    }
    /**
     *
     * 1.A=（今日最高+今日最低）/2
         B=（前日最高+前日最低）/2
         C=今日最高-今日最低
       2.EM=（A-B）*C/今日成交额
       3.EMV=N日内EM的累和
       4.MAEMV=EMV的M日的简单移动平均
         EMV指标
         EMV指标
        5.参数N为14，参数M为9
     * @param list
     */
    public  static void initEmv(List<StickData> list)
    {

       for(int i=0;i<list.size();i++)
       {
            if(i>14)
            {
               //计算emv
                for(int a=i;a>a-14;a--)
                {
                   //a


                   //b
                   //c
                }

            }
       }
    }

    /**
     * DMA（10）=10日股价平均值—50日股价平均值
     * AMA（10）=10日DMA平均值
     */
    private void Dma()
    {

        double[] inClose= new double[] {26.83,29.51,32.46};
        double total_50[]=new double[inClose.length];
        double total_10[]=new double[inClose.length];
        double[] dma=new double[inClose.length];
        double[] ama=new double[inClose.length];
        for(int i=0;i<inClose.length;i++)
        {
            if(i>=49)
            {
                for(int a=i;a>=i-49;i++)
                {
                    total_50[i]+=inClose[i];
                    if(i<10)
                    {
                        total_10[i]+=inClose[i];
                    }
                }
                dma[i]=total_10[i]/10-total_50[i]/50;
                if(i>=58)
                {
                    double t10=0;
                    for(int a=i;a>i-10;i++)
                    {
                        t10+=dma[i];

                    }
                    ama[i]=t10/10;
                }

            }
        }
    }

}
